/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package test.net.sourceforge.pmd.jaxen;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.ast.ASTCompilationUnit;
import net.sourceforge.pmd.ast.ASTImportDeclaration;
import net.sourceforge.pmd.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
import net.sourceforge.pmd.ast.ASTStatement;
import net.sourceforge.pmd.ast.ASTTypeDeclaration;
import net.sourceforge.pmd.ast.Node;
import net.sourceforge.pmd.jaxen.DocumentNavigator;
import org.jaxen.BaseXPath;
import org.jaxen.JaxenException;
import org.jaxen.UnsupportedAxisException;
import test.net.sourceforge.pmd.rules.EmptyCatchBlockRuleTest;
import test.net.sourceforge.pmd.testframework.RuleTst;
import java.util.Iterator;
import java.util.List;
public class DocumentNavigatorTest extends RuleTst {
private TestRule rule;
private class TestRule extends AbstractRule {
private Node compilationUnit;
private Node importDeclaration;
private Node typeDeclaration;
private Node statement;
private Node primaryPrefix;
private Node primaryExpression;
private Node methodDeclaration;
/**
* @see net.sourceforge.pmd.ast.JavaParserVisitor#visit(ASTCompilationUnit, Object)
*/
public Object visit(ASTCompilationUnit node, Object data) {
this.compilationUnit = node;
return super.visit(node, data);
}
public Object visit(ASTImportDeclaration node, Object data) {
this.importDeclaration = node;
return super.visit(node, data);
}
public Object visit(ASTTypeDeclaration node, Object data) {
this.typeDeclaration = node;
return super.visit(node, data);
}
public Object visit(ASTStatement node, Object data) {
this.statement = node;
return super.visit(node, data);
}
public Object visit(ASTPrimaryPrefix node, Object data) {
this.primaryPrefix = node;
return super.visit(node, data);
}
public Object visit(ASTMethodDeclaration node, Object data) {
this.methodDeclaration = node;
return super.visit(node, data);
}
public Object visit(ASTPrimaryExpression node, Object data) {
this.primaryExpression = node;
return super.visit(node, data);
}
}
public void setUp() throws Exception {
try{
rule = new TestRule();
runTestFromString(EmptyCatchBlockRuleTest.TEST1, rule, new Report());
} catch (Throwable xx) {
fail();
}
}
public void testChildAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter =nav.getChildAxisIterator(rule.compilationUnit);
assertSame(rule.compilationUnit.jjtGetChild(0), iter.next());
assertSame(rule.compilationUnit.jjtGetChild(1), iter.next());
assertFalse(iter.hasNext());
}
public void testParentAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter =nav.getParentAxisIterator(rule.importDeclaration);
assertSame(rule.importDeclaration.jjtGetParent(), iter.next());
assertFalse(iter.hasNext());
}
public void testParentAxisIterator2() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter =nav.getParentAxisIterator(rule.compilationUnit);
assertFalse(iter.hasNext());
}
public void testDescendantAxisIterator() throws UnsupportedAxisException {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter = nav.getDescendantAxisIterator(rule.statement);
Node statementExpression = rule.statement.jjtGetChild(0);
assertSame(statementExpression, iter.next());
Node primaryExpression = statementExpression.jjtGetChild(0);
assertSame(primaryExpression, iter.next());
Node primaryPrefix = primaryExpression.jjtGetChild(0);
assertSame(primaryPrefix, iter.next());
Node primarySuffix = primaryExpression.jjtGetChild(1);
assertSame(primarySuffix, iter.next());
Node name = primaryPrefix.jjtGetChild(0);
assertSame(name, iter.next());
Node arguments = primarySuffix.jjtGetChild(0);
assertSame(arguments, iter.next());
assertFalse(iter.hasNext());
}
public void testDescendantAxisIterator2() throws UnsupportedAxisException {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter = nav.getDescendantAxisIterator(rule.primaryPrefix);
Node name = rule.primaryPrefix.jjtGetChild(0);
assertSame(name, iter.next());
assertFalse(iter.hasNext());
}
public void testFollowingSiblingAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
assertSame(rule.primaryExpression.jjtGetChild(1), iter.next());
assertFalse(iter.hasNext());
}
public void testFollowingSiblingAxisIterator2() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
assertFalse(iter.hasNext());
}
public void testPrecedingSiblingAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
assertSame(rule.primaryExpression.jjtGetChild(0), iter.next());
assertFalse(iter.hasNext());
}
public void testPrecedingSiblingAxisIterator2() {
DocumentNavigator nav = new DocumentNavigator();
Iterator iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
assertFalse(iter.hasNext());
}
public void testXPath() throws JaxenException {
BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
List matches = xPath.selectNodes(rule.statement);
assertEquals(6, matches.size());
}
public void testXPath2() throws JaxenException {
BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
List matches = xPath.selectNodes(rule.importDeclaration);
assertEquals(1, matches.size());
}
}